package br.org.desa.agendaescolar.bean;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletResponse;

import br.org.desa.agendaescolar.controlador.CompromissoControle;
import br.org.desa.agendaescolar.controlador.UsuarioControle;
import br.org.desa.agendaescolar.modelo.*;

@ManagedBean(name="Aluno")
@SessionScoped
public class AlunoBean implements Serializable {
	@ManagedProperty(value="#{Sessao}")
	private SessaoBean sessao;
	private Usuario aluno = new Usuario();
	private Date dataAniversarioAluno = new Date();
	private UsuarioControle usuarioControle = new UsuarioControle();
	private CompromissoControle compromissoControle = new CompromissoControle();
	private List<Compromisso> compromissos = new ArrayList<Compromisso>();

		public AlunoBean(){}
	
	public SessaoBean getSessao() {
		return sessao;
	}

	public void setSessao(SessaoBean sessao) {
		this.sessao = sessao;
	}	
		
	public Usuario getAluno() {
		return aluno;
	}

	public void setAluno(Usuario aluno) {
		this.aluno = aluno;
	}
	
	public List<Compromisso> getCompromissos() {
		return compromissos;
	}

	public void setCompromissos(List<Compromisso> compromissos) {
		this.compromissos = compromissos;
	}
	
	public Date getDataAniversarioAluno() {
		return dataAniversarioAluno;
	}

	public void setDataAniversarioAluno(Date dataAniversarioAluno) {
		this.dataAniversarioAluno = dataAniversarioAluno;
	}

	// METODOS GERAIS
	public String cadastrarAluno(){
		FacesContext context = FacesContext.getCurrentInstance();
		if(usuarioControle.buscaUsuarioPorLogin(aluno.getLogin()) == null){
			aluno.setTipoUsuario(TipoUsuario.ALUNO);
			GregorianCalendar cal = new GregorianCalendar();
			cal.setTime(this.dataAniversarioAluno);
			aluno.setDataAniversario(cal);
			try{
				usuarioControle.cadastraUsuario(aluno);
				context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Cadastro de usuário realizado com sucesso.", ""));
				return "Login";
			}catch(Exception e){
				context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Falha ao cadastrar usuário.", ""));
				return null;
			}finally{
				aluno = null;
				aluno = new Usuario();
			}
		}else{
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "E-mail/login já cadastrado", ""));
			return null;
		}
		
	}
	
	public void marcarCompromisso(){
		FacesContext context = FacesContext.getCurrentInstance();
		Map<String, String> params = context.getExternalContext().getRequestParameterMap();
		int codigo = Integer.parseInt(params.get("Codigo"));
		int unidade = Integer.parseInt(params.get("Unidade"));
		
		int quantAgendaUnd = Integer.parseInt(compromissoControle.buscaQntCompromissosPorUnidade(this.sessao.getUsuario(),unidade));
		if (quantAgendaUnd < 2){
			 
			Compromisso marcado = compromissoControle.buscaCompromissoPorCodigo(Integer.toString(codigo));
			
			marcado.setDataHoraAgendamentoAluno(new GregorianCalendar());
			marcado.setAluno(this.sessao.getUsuario());
			marcado.setDisponivel(false);
			compromissoControle.alterarCompromisso(marcado);
			
			compromissos.clear();
			compromissos.addAll(compromissoControle.listaCompromissosDisponiveis("true"));
			
			//this.comprovantePDF(marcado);
		}else{
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Não foi possível marcar este horário pois o aluno já possui dois agendamentos para esta Unidade.", ""));
		}
	}
	
	public void imprimeComprovanteAgendamento(){
		FacesContext context = FacesContext.getCurrentInstance();
		Map<String, String> params = context.getExternalContext().getRequestParameterMap();
		int codigo = Integer.parseInt(params.get("Codigo"));;
		
		Compromisso marcado = compromissoControle.buscaCompromissoPorCodigo(Integer.toString(codigo));
		
	//	this.comprovantePDF(marcado);
	}
	
	/*public String comprovantePDF(Compromisso compromisso){
		String path = compromissoControle.gerarPDF(compromisso);
		HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        byte[] byteArray=null;
        File file = null;
		try {
			 file = new File(path);  
			   
	         FileInputStream fis = new FileInputStream(file);  
	         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
	         byte[] buf = new byte[1024];  
	         try {  
	             for (int readNum; (readNum = fis.read(buf)) != -1;) {  
	                 bos.write(buf, 0, readNum); //no doubt here is 0  
	                 System.out.println("read " + readNum + " bytes,");  
	             }  
	         } catch (IOException ex) {}  
	         byteArray = bos.toByteArray();
            
            
            response.setContentType("application/pdf");
			response.setHeader("Content-disposition","attachment;filename=ArquivoPDF.pdf");
			response.getOutputStream().write(byteArray);
			FacesContext.getCurrentInstance().responseComplete();
			return "listaCompromissosAluno";
			
		} catch (Exception e) {
			return null;
		}finally{
			file.delete();
		}
		
	}*/
	
	public void listaCompromissosDisponiveis(ActionEvent e){
		compromissos.clear();
		compromissos.addAll(compromissoControle.listaCompromissosDisponiveis("true"));
	}
	
	public void listaCompromissosAluno(ActionEvent e){
		List<Compromisso> compromissosAluno = compromissoControle.listaCompromissosPorAluno(sessao.getUsuario());
		compromissos.clear();
		compromissos.addAll(compromissosAluno);
	}
		
}
